package com.cy.pj.health.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * 此对象应用于处理DispatcherServlet(SpringMVC中的核心处理器)交给它的请求
 */
@Controller//此注解描述的对象为Controller请求的处理器对象，我们通常称之为handler
public class TemplateController {
    /**
     * @RequestMapping 注解描述方法时用于定义请求url到controller中方法的映射
     * @return view 的名字
     * 请求地址：http://localhost/doTemplateUI
     * 请求的简易处理过程
     * 1)基于域名获取ip地址
     * 2)基于ip地址找到网络中计算机（ip地址是网络中计算机的唯一标识）
     * 3)基于端口找到tomcat服务（port是计算机中应用的唯一标识）
     * 4)tomcat服务会基于thread并借助io读取网络http协议中请求数据
     * 5)tomcat内部会创建请求（request）和响应（response）对象，用于封装请求和响应信息
     * 6)tomcat会调用filter对象对request数据进行过滤
     * 7）Filter对request过滤以后，会将请求交给DispatcherServlet进行处理？
     * 8)DispatcherServlet读取请求中的url，并基于url从requestMapping中找到对应的handler以及对应方法
     * 9)DispatcherServlet基于反射技术调用handler方法
     * 10)DispatcherServlet会将handler方法返回的view等相关信息进行封装，然后交给视图解析器进行解析
     * 11）viewResolver视图解析器对为view name添加前缀，后缀，并将model中数据填充打到view中
     * 12）DispatcherServlet 将视图解析器解析的结果封装到response对象，并将其响应到客户端
     * 说明：
     * 1)此方法试试DispatcherServlet基于反射技术进行调用？
     * 2)反射技术的最大优势？不能预知未来，但可以驾驭未来。
     * 3)
     */
    @RequestMapping("/doTemplateUI")
    public String doTemplateUI(){
        return "default";//view name
        //思考？
        //1）这里的返回值会交给谁？当然是方法调用者(DispatcherServlet)
        //2) dispatcherServlet会将方法的返回值封装到ModelAndView对象中
        //3) 将ModelandView对象交给视图解析器(ViewResolver)进行解析
        //4) 视图解析器对为view name添加前缀，后缀，并将model中数据填充打到view中
        //4.1)默认前缀为/templates/，默认的后缀为.html
    }
    @RequestMapping("/doTemplateModelAndView01")
    public String doTemplateModelAndView01(Model model){
        //model是一个view中要呈现的数据的一个对象
        model.addAttribute("msg", "html Template Page");
        return "default";//view name
    }

    @RequestMapping("/doTemplateModelAndView02")
    public ModelAndView doTemplateModelAndView02(ModelAndView mv){
        //model是一个view中要呈现的数据的一个对象
        mv.addObject("msg", "html Template Page");
        mv.setViewName("default");
        return mv;//view name
    }
}
